package cn.itcast.web.tag;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;

/***
 * 功能  输出当前访问的ip
 * 调用过程
 *JSP引擎遇到自定义标签，首先创建标签处理器类的实例对象。
    JSP引擎实例化完标签处理器类后，调用setPageContext()方法，将pageContext对象传递给标签处理器类，使得标签处理器类可以通过pageContext对象与JSP页面进行通信！
   setPageContext()方法执行完后，调用setParent()方法，将当前标签的父标签传递给当前处理器类，如果当前标签没有父标签，则传入null
   当WEB容器执行到自定义标签的开始标记时，调用doStartTag()方法。
    当WEB容器执行到自定义标签的结束标记时，调用doEndTag()方法。
      一般来说，当WEB容器执行完自定义标签后，标签处理器类会驻留在内存中，直至停止WEB应用时，WEB容器才会调用release()方法
 */
public class ViewIPTag implements Tag {

	private PageContext pageContext;
	
	public int doStartTag() throws JspException {
		
		HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
		JspWriter out = pageContext.getOut();
		
		String ip = request.getRemoteAddr();
    	try {
			out.write(ip);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		
		return 0;  // int SKIP_BODY = 0;标签体不会被执行
	}
	
	public int doEndTag() throws JspException {
		return 0;
	}
	public Tag getParent() {
		return null;
	}
	public void release() {
	}
	public void setPageContext(PageContext arg0) {
		this.pageContext = arg0;
	}
	public void setParent(Tag arg0) {
	}
}
